package cn.learn.dao;

import cn.learn.domain.ElasticsearchQuery;
import org.elasticsearch.common.geo.GeoPoint;
import org.elasticsearch.search.SearchHits;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @author huangyezhan
 * @version 1.0
 * @date 2020年06月30日11:19
 */
public interface OperationElasticsearchDocDao {
    /**
     * 创建索引映射
     *
     * @param indexName 创建索引的名称
     * @param mapping   索引映射的json字符串
     * @return 是否创建成功
     * @throws IOException IO流异常
     */
    boolean createIndexMapping(String indexName, String mapping) throws IOException;

    /**
     * 删除索引
     *
     * @param index 索引
     * @return 是否删除成功
     * @throws IOException IO流异常
     */
    boolean deleteIndex(String index) throws IOException;

    /**
     * 批量更改数据
     *
     * @param data  数据
     * @param index 索引
     */
    void bulk(List<Map<String, String>> data, String index) ;

    /**
     * 根据条件查询数据
     *
     * @param query 查询条件对象
     * @return 查询返回结果
     * @throws IOException IO异常
     */
    SearchHits query(ElasticsearchQuery query) throws IOException;

    /**
     * 获取地图矩形内的坐标（经纬度）
     * https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-geo-queries.html#java-query-dsl-geo-bounding-box-query
     *
     * @param query       查询普通条件
     * @param topLeft     左上角经纬度
     * @param bottomRight 右下角经纬度
     * @return 返回结果
     * @throws IOException IO流异常
     */
    SearchHits geoBoundingBox(ElasticsearchQuery query, String topLeft, String bottomRight) throws IOException;

    /**
     * 地图多边形查询
     *
     * @param query  查询条件
     * @param points 多边形的点坐标
     * @return 查询结果
     * @throws IOException io流异常
     */
    SearchHits geoPolygon(ElasticsearchQuery query, List<GeoPoint> points) throws IOException;

    /**
     * 搜索公共文件
     *
     * @param query 查询条件
     * @return 返回结果
     * @throws IOException 异常
     */
    SearchHits officialDocument(ElasticsearchQuery query) throws IOException;

}
